package com.tools.entity;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.ComboBox;

/**
 * Table的key与packageName属性
 *
 * @author < a href=" ">ZhangYang</ a>
 * @version v1.0.01
 * @date 2018-08-24 16:18:04
 */

public class TableAttributeEntity implements Comparable<TableAttributeEntity> {
  // ---------------------------表格需要的属性---------------------------------
  /** 是否创建 */
  private BooleanProperty tdCreate = new SimpleBooleanProperty(true);
  /** 列名 */
  private StringProperty tdColumnName = new SimpleStringProperty();
  /** jdbc数据类型 */
  private StringProperty tdJdbcType = new SimpleStringProperty();
  /** java数据类型 */
  private ComboBox<String> tdJavaType = new ComboBox<String>();
  /** 属性名称 */
  private StringProperty tdField = new SimpleStringProperty();

  // --------------------自定义属性--------------------------------
  /**
   * 是否允许使用 NULL值<br>
   * true = 明确允许使用 NULL值<br>
   * false = 可能不允许使用 NULL值(不明确是否允许使用NULL值)<br>
   */
  private boolean nullable;

  // ----------------java.sql.DatabaseMetaData.getColumns自带的属性----------------------
  /** 默认值 */
  private String columnDef;
  /** 描述列的注释 */
  private String remarks;
  /** 列的大小,对于 字符串 或 date 类型,列的大小是最大字符数,对于 numeric 和 decimal 类型,列的大小就是精度 */
  private int columnSize;
  /** 小数部分的位数 */
  private int decimalDigits;
  /** 表中的列的顺序(从 1 开始) */
  private int ordinalPosition;

  /**
   * 初始化
   */
  public TableAttributeEntity() {
    super();
    initComboBox();
  }

  /**
   * 初始化
   *
   * @param javaType 数据类型
   * @param fieldName 字段名称
   */
  public TableAttributeEntity(String javaType, String fieldName) {
    super();
    initComboBox();
    this.tdJavaType.setValue(javaType);
    this.tdField.setValue(fieldName);
  }

  public void initComboBox() {
    tdJavaType.setEditable(true);
    tdJavaType.getItems()
              .addAll("int", "double", "char", "long", "java.util.Date", "java.sql.Date", "java.time.LocalDate",
                      "java.time.LocalTime", "java.time.LocalDateTime", "java.util.List<E>", "java.util.Set<E>",
                      "java.util.Map<K, V>", "JsonObject", "String", "Character", "Double", "Integer", "Long", "Object"
              );
  }

  public BooleanProperty tdCreateProperty() {
    return tdCreate;
  }

  public boolean getTdCreate() {
    return tdCreate.get();
  }

  public void setTdCreate(boolean create) {
    this.tdCreate.set(create);
  }

  public String getTdColumnName() {
    return tdColumnName.getValue();
  }

  public void setTdColumnName(String tdColumnName) {
    this.tdColumnName.setValue(tdColumnName);
  }

  public void setTdColumnName(StringProperty tdColumnName) {
    this.tdColumnName = tdColumnName;
  }

  public String getTdJdbcType() {
    return tdJdbcType.getValue();
  }

  public void setTdJdbcType(String tdJdbcType) {
    this.tdJdbcType.setValue(tdJdbcType);
  }

  public void setTdJdbcType(StringProperty tdJdbcType) {
    this.tdJdbcType = tdJdbcType;
  }

  public ComboBox<String> getTdJavaType() {
    return tdJavaType;
  }

  public void setTdJavaType(String tdJavaType) {
    this.tdJavaType.setValue(tdJavaType);
  }

  public void setTdJavaType(ComboBox<String> tdJavaType) {
    this.tdJavaType = tdJavaType;
  }

  public String getTdField() {
    return tdField.getValue();
  }

  public void setTdField(String tdField) {
    this.tdField.setValue(tdField);
  }

  public void setTdField(StringProperty tdField) {
    this.tdField = tdField;
  }

  public String getColumnDef() {
    return columnDef;
  }

  public void setColumnDef(String columnDef) {
    this.columnDef = columnDef;
  }

  public String getRemarks() {
    return remarks;
  }

  public void setRemarks(String remarks) {
    this.remarks = remarks;
  }

  public int getColumnSize() {
    return columnSize;
  }

  public void setColumnSize(int columnSize) {
    this.columnSize = columnSize;
  }

  public int getDecimalDigits() {
    return decimalDigits;
  }

  public void setDecimalDigits(int decimalDigits) {
    this.decimalDigits = decimalDigits;
  }

  public boolean isNullable() {
    return nullable;
  }

  public void setNullable(boolean nullable) {
    this.nullable = nullable;
  }

  public int getOrdinalPosition() {
    return ordinalPosition;
  }

  public void setOrdinalPosition(int ordinalPosition) {
    this.ordinalPosition = ordinalPosition;
  }

  @Override
  public String toString() {
    return "TableAttributeEntity [tdCreate=" + tdCreate + ", tdColumnName=" + tdColumnName + ", tdJdbcType="
      + tdJdbcType + ", tdJavaType=" + tdJavaType + ", tdField=" + tdField + ", nullable=" + nullable + ", columnDef="
      + columnDef + ", remarks=" + remarks + ", columnSize=" + columnSize + ", decimalDigits=" + decimalDigits
      + ", ordinalPosition=" + ordinalPosition + "]";
  }

  @Override
  public int compareTo(TableAttributeEntity obj) {
    return ordinalPosition > obj.getOrdinalPosition() ? 1 : (ordinalPosition == obj.getOrdinalPosition() ? 0 : -1);
  }

}
